{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RDKit: making new molecules using reaction SMARTS"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook explores using `RDKit` to define chemical reactions and to use these reactions to create new molecules from existing reactants. It uses RDKit's SMARTS matches.  This notebook isn't a replacment for the [rdkit documentation](http://www.rdkit.org/docs/), but is intended to complement it."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "@TAGS: #basics #reactions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "# import rdkit components\n",
    "from rdkit import rdBase\n",
    "from rdkit import Chem\n",
    "from rdkit.Chem import AllChem\n",
    "from rdkit.Chem import Draw\n",
    "from rdkit.Chem import rdMolDescriptors\n",
    "\n",
    "# use IPythonConsole for pretty drawings\n",
    "from rdkit.Chem.Draw import IPythonConsole\n",
    "\n",
    "## The next line is commented out \n",
    "### because GitHub does not render svg's embedded in notebooks\n",
    "# IPythonConsole.ipython_useSVG=True\n",
    "IPythonConsole.ipython_useSVG=False\n",
    "\n",
    "# for flattening tuples and lists\n",
    "from itertools import chain"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# An example unimolecular reaction: the oxidation of alcohols to ketones\n",
    "\n",
    "It's easy to get a feel for how the system works with some simple examples.  Let's take the oxidation of alcohols to ketones/aldehydes.  In real life, these reactions are not really unimolecular.  The electrons and hydrogen atoms that leave during the oxidation have to go somewhere.  But in these examples we aren't tracking the fate of those atoms; we're only tracking the transformations that happen to a single rdkit molecule.  That's what we mean by unimolecular."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAADICAIAAAD0hVwYAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3deVxU5f4H8M8soCCaYrngkgoqSpaKW0qu1NWwTcOuN8EWwzXEssjlihQq5AZp5XLrivq7dl2yK7kkVqZoopIrCoqYCIgKqCwKI8zz++PQOOC4IHDOHPi8X/yRz5mZ801w5sNznvN9NEIIEBERERGRddMqXQARERERET0YgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpgF7pAoiIiOiRxMdj/34MHw5Hx1LjP/2EzEy8+WapwZQU/PQT0tJgY4OOHfHCC6hTR85iiajiNEIIpWsgIiKi8ouIQEAAjhxB586lxr28cPgwLl8u+aPRiI8/RkQEtFq0bo38fKSmolEj/OtfeOkl+asmokfGGXciokeUn58/derU48ePOzk5ubq6ynnqlJSUpKSkZs2aLV26tFGjRnKemtRnxgwsXIgJEzB3Lh57DABOnICPD4YNw9696NVL6fqI6GExuBMRPSI3N7cLFy4oW8OOHTsyMzNtbW2VLYOs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lpaUlLR79+7i4uJ33nnnm2++kfPsROUSEhLyz3/+083N7ejRo9JyarJmx44d+/rrr+vWrTtv3rxq9v06ceLE0qVLHRwc5s+fr9VqlS7nUTC4ExE9otatW//555/K1lC3bt3MzEzpBiwi61RQUNCxY8fz589//fXX48aNU7ocIhVjcCciekT5+flTp049fvy4k5OTq6urnKdOSUlJSkpq1qzZ0qVLpa5nRNZs48aN3t7ejo6OZ86cadiwodLlEKkVgzsRERFVuRdeeCE6OjogIGDx4sVK10KkVqpc30NERETqMn/+/G7dur322mtKF0KkYpxxJyIiIiJSAc64ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqQCDOxERERGRCjC4ExERERGpAIM7EREREZEKMLgTEREREakAgzsRERERkQowuBMRERERqcD/A/pD1fRHnhBeAAAAZXpUWHRyZGtpdFBLTCByZGtpdCAyMDI0LjA5LjUAAHice79v7T0GIBAAYiYGCGCGshsY2RgSgDQjM4RmYuKA8Bm5GRgZGJkYnECqxfVAQgwwvQ/dlu0Hat3HgAD2IAIobg8TFwMA1U4NEsmFbZ8AAACoelRYdE1PTCByZGtpdCAyMDI0LjA5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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ethanol = Chem.MolFromSmiles('CCO')\n",
    "isopropanol = Chem.MolFromSmiles('CC(C)O')\n",
    "phenol = Chem.MolFromSmiles('c1cccc(O)c1')\n",
    "t_butanol = Chem.MolFromSmiles('C(C)(C)(C)O')\n",
    "glycerol = Chem.MolFromSmiles('OCC(O)CO')\n",
    "\n",
    "alcohols = [ethanol, isopropanol, phenol, t_butanol, glycerol]\n",
    "\n",
    "Draw.MolsToGridImage(alcohols, molsPerRow=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A very general reaction definition\n",
    "\n",
    "There are a few ways we could imagine defining the reaction.  We'll take the most general way imaginable first."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "rxn_1 = AllChem.ReactionFromSmarts('[#6:1][O:2]>>[#6:1]=[O:2]')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<rdkit.Chem.rdChemReactions.ChemicalReaction at 0x2af2d4b0580>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This definition says:\n",
    "\n",
    "  1. Take _any_ carbon atom, which we'll label as atom #1, whether aliphatic or aromatic, that ...\n",
    "  2. ... is bound via a single bond to an aliphatic oxygen atom (capital O), that we label as atom #2, and\n",
    "  3. transform the linkage between these atoms to be a double bond.\n",
    "  \n",
    "This is an OK definition, but it is going to run into problems.  Phenol and $t$-butanol don't oxidize, because if they did it would either disrupt aromaticity or result in a pentavalent carbon.  rdkit has ways of letting us know about this, as we shall see.\n",
    "\n",
    "First, we have to run the reaction.  Let's show it working on isopropanol."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((<rdkit.Chem.rdchem.Mol at 0x2af2d4b0970>,),)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1.RunReactants((isopropanol, ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [],
   "source": [
    "prod = rxn_1.RunReactants((isopropanol, ))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x2af2d4b0740>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prod[0][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A couple of things to note about the input and output to the `RunReactants()` method:\n",
    "  1.  The input is a Python _tuple_.  Note the extra parentheses and the trailing comma in the input above.  For the single molecule we have here, it seems confusing, but this format makes it easy to supply multiple molecules into a single reaction.\n",
    "  2.  The output is a tuple of tuples.  The _inner_ tuples are there because even reactions that take only a single input molecule can result in multiple output molecules (e.g. hydrolysis).  The _outer_ tuples are there because rdkit applies your reaction incidence of the appropriate motifs in the input molecule, even if it occurs more than once.  \n",
    "  \n",
    "The upshot of all this is that it can take a bit of indexing to get your molecule out.  Note the trailing `[0][0]` below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7f9dfa0a6eb0>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1.RunReactants((isopropanol, ))[0][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Behold!  We have produced acetone.  Now let's try one of the problematic examples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x2af2d4b0eb0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1.RunReactants((t_butanol, ))[0][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Uh-oh!  RDKit gave us a pentavalent carbon.  That can't be right.  \n",
    "\n",
    "The reason this happens is that by default, the products of `RunReactants` are not sanitized, i.e., rdkit doesn't check to see if they make sense.  We can do that check using `Chem.SanitizeMol()`, and the results match up with chemical common sense."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# acetone can be sanitized, no problems here\n",
    "acetone = rxn_1.RunReactants((isopropanol, ))[0][0]\n",
    "Chem.SanitizeMol(acetone)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7f9df9b6a2e0>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "acetone"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sanitization FAILED!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[11:47:37] Explicit valence for atom # 0 C, 5, is greater than permitted\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x2af2d4b0e40>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#doctest: IGNORE\n",
    "# \"t-butyl ketone\" cannot be sanitized, this is going to give an error\n",
    "crazy_molecule = rxn_1.RunReactants((t_butanol, ))[0][0]\n",
    "try:\n",
    "    Chem.SanitizeMol(crazy_molecule)\n",
    "except ValueError:\n",
    "    print('Sanitization FAILED!')\n",
    "    \n",
    "# Drawing the moecule will create rdkit warning messages that start with `RDKit ERROR:`\n",
    "crazy_molecule"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The warning message is a clue that something is wonky with the \"ketone\" that we created with the reaction. Phenol presents another problematic case for our reaction.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sanitization failed.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "RDKit ERROR: [16:50:13] Can't kekulize mol.  Unkekulized atoms: 2 3 4 5 6\n",
      "RDKit ERROR: \n"
     ]
    }
   ],
   "source": [
    "#doctest: IGNORE\n",
    "# \"phenyl ketone\" cannot be kekulized\n",
    "crazy_molecule = rxn_1.RunReactants((phenol, ))[0][0]\n",
    "try:\n",
    "    Chem.SanitizeMol(crazy_molecule)\n",
    "except ValueError:\n",
    "    print(\"Sanitization failed.\")\n",
    "    \n",
    "# Drawing the molecule will create rdkit warning messages that start with `RDKit ERROR:`,\n",
    "# so we skip it here\n",
    "crazy_molecule = rxn_1.RunReactants((phenol, ))[0][0]\n",
    "# crazy_molecule"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The lesson here is that reactions can create crazy molecules.  This is usually a sign that your reaction is defined too generally.  There are ways to fix that, but for now, let's see what happens with glycerol."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((<rdkit.Chem.rdchem.Mol at 0x2af2d4b0ba0>,),\n",
       " (<rdkit.Chem.rdchem.Mol at 0x2af2d4b1380>,),\n",
       " (<rdkit.Chem.rdchem.Mol at 0x2af2d4b1310>,))"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1.RunReactants((glycerol, ))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now the ouput is a length-3 tuple of length-1 tuples.  This means that rdkit found three places in the reactant to apply the reaction rule, and each reaction created a single molecule as the product.  This makes sense because glycerol does have three hydroxyl atoms that can be oxidized.  A Pythonic way to look at all these products at once is to unpack the tuples with the `chain.from_iterable()` method from `itertools`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "glycerol_products = list(chain.from_iterable(rxn_1.RunReactants((glycerol, ))))\n",
    "[Chem.SanitizeMol(mol) for mol in glycerol_products]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Draw.MolsToGridImage(glycerol_products)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "rdkit does not know about the symmetry of the glycerol molecule, i.e. that oxidizing carbon 1 gives the same molecule as oxidizing carbon 3. So glyceraldehyde appears twice while dihydroxyacetone appears only once.  \n",
    "\n",
    "It can be tricky to reduce sets of molecules to \"unique\" sets of molecules in rdkit.  rdkit molecules are really pointers to locations in memory, so equating two molecules in Python will always give `False`.  Doing the comparison in a simple case like this can be done by converting to SMILES.   \n",
    "\n",
    "Once the molecules have been converted to SMILES string representations, we can use Python's `set` object type to keep only the unique objects, and then covert back to rdkit molecules."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "glycerol_unique_products = []\n",
    "glycerol_product_smiles = set()\n",
    "for mol in glycerol_products:\n",
    "    smi = Chem.MolToSmiles(mol)\n",
    "    if smi not in glycerol_product_smiles:\n",
    "        glycerol_product_smiles.add(smi)\n",
    "        glycerol_unique_products.append(mol)\n",
    "len(glycerol_unique_products)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Draw.MolsToGridImage(glycerol_unique_products)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we have only the two unique possible products.  It's worth noting that converting molecules to SMILES and then back into rdkit Molecules results in kekulization and sanitization, because unlike molecules created by `RunReactants()`, molecules created by `MolFromSmiles()` are kekulized and sanitized by default."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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HnvMUlJs5Ejz+ezWW23/fjOzb7+13r39r/S++yw3N8hFBkNZWdm8efO6d+/uXVR46KGHdu3addWtsrOzb775Zm9nmzBhwubNm8NQao2Vldnbb1vXriaZz2dPP+1fPmeONW5s8fH2yCOWkmLJyebzWf/+Vv7CCULUM6HZ7RYvtgED/J9Q48fbpk0B1ikstF/9ypo3N8maNClMTz979mxIiqnq6NGjqamp0dHRktq2bTtjxowLNblC+9lnnw0cOND7hBo7dmxOTk7oSq2xSy8+Vz5ZLyiwmTPtwQdt9Gi75x578UX/pWxPSYmlpNhbb1V/zJwcS0mxjRuDXGpKimVmVl/49deWkmJr11ZZuH27TZtmEyfa6NH22GP2xht2/nxF6/nzNmOGtWxpksXGWmqqnTwZ5FLrYO3atXfeeae3twwePPhvf/vbtW97/vz5GTNmtGrVSlJsbGxqauqJEydCV2qNrVtnI0f6/8aTkmzFiiqtO3fa9Ok2aZKNHm2PPGKzZ1txcUXr2rWWkmJff139MTMzLSUl5JUDlwjZ8VdJic2aZe3amWQxMZaS4j81qWbfPktJsaio9OTkG264YdasWaXexZMQuPST5WStPjRLSkpmzZrVvn17SVFRUVOmTDl8aT9WmF3jb/t6deRIxRFA27b1oft5//79KSkpUVFRkjp37lzrHbvycVubNm1qetwWEpV/2+3a1YffNlBHIb4QceVzlIvKVq5MHjXKO3AeMWLE6spdWUES9GtNx48fT0tLa9SokaT4+PiMjIziyse84XQt598uWLfORo267DlKuBQXF8+YMaNly5aSGjVqlJqaeqpyH2etVL6Sf+utty5btiwopdbYpeffdX5pQH0QlivyW7bY3Xf7P6ESE23RoktXubQrZffu3UF58u3bt99zzz3low8WXq7bsla2bds2adIk78H79u37UZhHbXzzjT30kP8Xm5Bg9bbbMpyysqxHj4ru57y88D55Vq9evcqHX30b1M7vaxzbFSpZWRU9shMm2JYtYX12IJTC2DXtjWO84gCZyuMzrzy47lp449G9kzZvPHqITtqys7P79etXfrr59aWdH0F35oylp1vjxiZdaYyum8rHMUrWtKmlpdmZM6F+zi1bttx9993ePpCYmLgo0NFe3VW+28c73ax8t0+obNtmEyf6/3IbwhhdoKbCO0aruLji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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "smi_list = [Chem.MolToSmiles(mol) for mol in glycerol_products]\n",
    "smi_col  = set(smi_list)\n",
    "mols = [Chem.MolFromSmiles(smiles) for smiles in smi_col]\n",
    "Draw.MolsToGridImage(mols)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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HnvMUlJs5Ejz+ezWW23/fjOzb7+13r39r/S++yw3N8hFBkNZWdm8efO6d+/uXVR46KGHdu3addWtsrOzb775Zm9nmzBhwubNm8NQao2Vldnbb1vXriaZz2dPP+1fPmeONW5s8fH2yCOWkmLJyebzWf/+Vv7CCULUM6HZ7RYvtgED/J9Q48fbpk0B1ikstF/9ypo3N8maNClMTz979mxIiqnq6NGjqamp0dHRktq2bTtjxowLNblC+9lnnw0cOND7hBo7dmxOTk7oSq2xSy8+Vz5ZLyiwmTPtwQdt9Gi75x578UX/pWxPSYmlpNhbb1V/zJwcS0mxjRuDXGpKimVmVl/49deWkmJr11ZZuH27TZtmEyfa6NH22GP2xht2/nxF6/nzNmOGtWxpksXGWmqqnTwZ5FLrYO3atXfeeae3twwePPhvf/vbtW97/vz5GTNmtGrVSlJsbGxqauqJEydCV2qNrVtnI0f6/8aTkmzFiiqtO3fa9Ok2aZKNHm2PPGKzZ1txcUXr2rWWkmJff139MTMzLSUl5JUDlwjZ8VdJic2aZe3amWQxMZaS4j81qWbfPktJsaio9OTkG264YdasWaXexZMQuPST5WStPjRLSkpmzZrVvn17SVFRUVOmTDl8aT9WmF3jb/t6deRIxRFA27b1oft5//79KSkpUVFRkjp37lzrHbvycVubNm1qetwWEpV/2+3a1YffNlBHIb4QceVzlIvKVq5MHjXKO3AeMWLE6spdWUES9GtNx48fT0tLa9SokaT4+PiMjIziyse84XQt598uWLfORo267DlKuBQXF8+YMaNly5aSGjVqlJqaeqpyH2etVL6Sf+utty5btiwopdbYpeffdX5pQH0QlivyW7bY3Xf7P6ESE23RoktXubQrZffu3UF58u3bt99zzz3low8WXq7bsla2bds2adIk78H79u37UZhHbXzzjT30kP8Xm5Bg9bbbMpyysqxHj4ru57y88D55Vq9evcqHX30b1M7vaxzbFSpZWRU9shMm2JYtYX12IJTC2DXtjWO84gCZyuMzrzy47lp449G9kzZvPHqITtqys7P79etXfrr59aWdH0F35oylp1vjxiZdaYyum8rHMUrWtKmlpdmZM6F+zi1bttx9993ePpCYmLgo0NFe3VW+28c73ax8t0+obNtmEyf6/3IbwhhdoKbCO0aruLji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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A better, more specific reaction definition\n",
    "\n",
    "We can fix most of the problems we've experienced with a better-defined SMARTS reaction.  Here's one that will only work on aliphatic primary or secondary alcohols."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "rxn_2 = AllChem.ReactionFromSmarts('[CH:1][O:2]>>[C:1]=[O:2]')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this version of the reaction, we specify that the alcohol in question must be _aliphatic_ (we've used a capital `C` in the reactant definition above) and additionally that this carbon atom must be bound to at least one hydrogen (the `h`) above.\n",
    "\n",
    "We now apply the reaction to every molecule in our alcohol set and look at all the products."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_products_tuples = tuple(rxn_2.RunReactants((mol, )) for mol in alcohols)\n",
    "all_products = list(chain.from_iterable(chain.from_iterable(all_products_tuples)))\n",
    "\n",
    "all_products_smiles = set()\n",
    "all_products_unique = []\n",
    "for mol in all_products:\n",
    "    smi = Chem.MolToSmiles(mol)\n",
    "    if smi not in all_products_smiles:\n",
    "        all_products_smiles.add(smi)\n",
    "        all_products_unique.append(mol)\n",
    "len(all_products_unique)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Draw.MolsToGridImage(all_products_unique)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The new reaction definition automatically excludes tertiary alcohols and aryl alchols.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## More complex reactions\n",
    "\n",
    "The same basic ideas can be used to create reactions that involve more than one reactant molecule, or that create more than one product.  The only new idea is that a dot `.` is used in SMARTS reactions definitions to separate molecules in the input or output. \n",
    "\n",
    "Let's continue with the example set of alcohols, and this time eliminate water from them, creating an alkene and a water molecule.  We'll explicitly track both molecules this time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# helper functions to avoid typing the same thing over and over\n",
    "def to_smiles(mol_tuple):\n",
    "    return tuple(Chem.MolToSmiles(mol) for mol in mol_tuple)\n",
    "\n",
    "def from_smiles(smiles_tuple):\n",
    "    return tuple(Chem.MolFromSmiles(smiles) for smiles in smiles_tuple)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of unique product sets: 5\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "water_elimination_smarts = '[C!H0:1][C:2][O:3]>>[C:1]=[C:2].[O:3]'\n",
    "water_elimination = AllChem.ReactionFromSmarts(water_elimination_smarts)\n",
    "\n",
    "# do the reaction on every alcohol in our set\n",
    "all_products_tuples = [water_elimination.RunReactants((mol, )) for mol in alcohols]\n",
    "all_products = chain.from_iterable(all_products_tuples)\n",
    "\n",
    "# convert to smiles and back to keep only unique products\n",
    "all_products_smiles = [to_smiles(mol_tuple) for mol_tuple in all_products]\n",
    "all_products_unique = [from_smiles(smiles_tuple) for smiles_tuple in set(all_products_smiles)]\n",
    "nProductSets = len(all_products_unique)\n",
    "print(\"Number of unique product sets:\",nProductSets)\n",
    "\n",
    "# draw each product set on its own line\n",
    "prod_tpl = tuple(chain(*all_products_unique))\n",
    "Draw.MolsToGridImage(prod_tpl,molsPerRow=water_elimination.GetNumProductTemplates())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As expected, every reaction produces two compounds, one of which is water.  As before, glycerol gives rise to two _unique_ products.  Phenol does not react because it does not match our reaction rule, which specifies aliphatic carbons.  Unlike the oxidation reaction, $t$-butanol does react, since now it matches the reaction rule, forming isobutylene.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A few other examples\n",
    "\n",
    "### Thiazole synthesis\n",
    "\n",
    "The case we haven't dealt with yet is defining reactions that take more than one molecule as input.  Here's an example of thiazole synthesis from a thiourea and a ketone."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Hantzsch thiazole synthesis\n",
    "thiourea = Chem.MolFromSmiles('CN(C)C(=S)N')\n",
    "haloketone = Chem.MolFromSmiles('c1ccccc1C(=O)C(C)Cl')\n",
    "rxn_smarts = '[NH2:1][C:2](=[S:3])[NH0:4].[C:5](=[O:6])[C:7][Cl:8]>>[N:4][c:2]1[s:3][c:5][c:7][n:1]1'\n",
    "rxn = AllChem.ReactionFromSmarts(rxn_smarts)\n",
    "product = rxn.RunReactants((thiourea, haloketone))[0][0]\n",
    "Chem.SanitizeMol(product)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_three = [thiourea, haloketone, product]\n",
    "formulae = [rdMolDescriptors.CalcMolFormula(mol) for mol in all_three]\n",
    "Draw.MolsToGridImage(all_three, legends = formulae)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Two things are worth noting in this case:\n",
    "\n",
    "1. The reaction as we defined it doesn't track all the atoms; a water and a hydrogen chloride disappear given our reaction definition.\n",
    "\n",
    "2. The order in which reactants appear in the tuple(s) supplied to `RunReactants()` matters!  In our reaction definition, the thiourea SMARTS came first, so when feeding in reactants the thiourea should appear in the same slot.  If reactants are supplied in the wrong order, they won't match the reaction rule and no products will result (see below)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "()\n"
     ]
    }
   ],
   "source": [
    "no_products = rxn.RunReactants((haloketone, thiourea))\n",
    "print(no_products)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Copper-catalyzed azide/alkyne cycloaddition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diyne_smiles = 'C#CCC(O)C#C'\n",
    "azide_smiles = 'CCCN=[N+]=[N-]'\n",
    "\n",
    "diyne = Chem.MolFromSmiles(diyne_smiles)\n",
    "azide = Chem.MolFromSmiles(azide_smiles)\n",
    "\n",
    "Draw.MolsToGridImage([diyne, azide])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define reaction\n",
    "copper_click_smarts = '''\n",
    "[CH:1]#[C:2].[N:3]=[N+:4]=[N-:5]>>\n",
    "[c:1]1[c:2][n-0:3][n-0:4][n-0:5]1.\n",
    "[c:2]1[c:1][n-0:3][n-0:4][n-0:5]1\n",
    "'''\n",
    "\n",
    "copper_click = AllChem.ReactionFromSmarts(copper_click_smarts)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\\require{mhchem}$\n",
    "Most varieties of the copper click work on terminal alkynes.  That presents a problem if we want to represent the variable regioselectivity (sometimes 1,4-disubstituted triazoles result, and sometimes 1,5-disubstituted triazoles result), because in the reactions SMARTS each carbon must be labeled with a specified & unique number.  So defining a reactant as something like `'([CH:1]#[C:2],[CH:2]#[C:1])'`, meaning that atom numbering is either $\\ce{H-^1C^#^2C-R}$ **or** $\\ce{H-^2C^#^1C-R}$) is NOT allowed.\n",
    "\n",
    "Here, we solve the problem by letting the reaction form two products, the first of which is the 1,4 product and the second of which is the 1,5 product."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "products_tuples = copper_click.RunReactants((diyne, azide))\n",
    "products = list(chain.from_iterable(products_tuples))\n",
    "[Chem.SanitizeMol(prod) for prod in products]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Draw.MolsToGridImage(products, molsPerRow = 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The reaction rule, as we saw above with glycerol, is only executed once per species.  So \"reactive\" groups remain in the output molecules.  Some simple Python scripting could then react these molecules again, generating the (bis)-triazoles.\n",
    "\n",
    "For more complex editing and manipulation of molecules, it might be worthwhile to investigate [RWMol objects](http://www.rdkit.org/Python_Docs/rdkit.Chem.rdchem.RWMol-class.html) instead of or in addition to the SMARTS reactions examples illustrated here."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "tutorial author: Curt Fischer, Jan 2017"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "celltoolbar": "Tags",
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
